package com.fangsiqi.mashibing;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDemo {
	static ReentrantLock lock=new ReentrantLock();

	public static void main(String[] args) {

	}

	public  static  void method(){
		// =============================================================================
		// lock.lock()-> 排队拿锁，拿不到死等，等到拿到锁。
		lock.lock(); // 排队拿锁，拿不到死等，等到拿到锁。
		try {
			// 允许被终端的拿锁方式 interrupt
			lock.lockInterruptibly();
		} catch (InterruptedException e) {
			// throw new RuntimeException(e);
			e.printStackTrace();
			return;
		}
		// =============================================================================
		// lock.tryLock()->尝试一下拿锁，拿到执行业务，拿不到返回false
		boolean b=lock.tryLock();
		if(b){
			try {
				System.out.println("我是业务逻辑");
				int i=1/0;
			} finally {
				lock.unlock(); // 一般释放锁，最好放到finally中
			}
		}

		// =============================================================================
		// lock.tryLock(2, TimeUnit.SECONDS);->尝试2s，拿锁，拿到返回true,没拿到返回false,在2s内，如果被中断了，抛出异常
		try {
			boolean b2=lock.tryLock(2, TimeUnit.SECONDS);
		}catch (InterruptedException e){
			e.printStackTrace();
			return ;
		}
	}
}
